package com.controller;

import com.ejb.UsuarioFacade;
import com.entidades.TipoEstado;
import com.entidades.TipoRol;
import com.entidades.Usuario;
import com.exceptions.BancoException;


import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.faces.bean.ManagedBean;

@ManagedBean(name = "gestorClientes")
@ViewScoped
public class GestorUsuarioController {

    private List<Usuario> listaClientes;
    private Usuario clienteSelected;
    private Usuario cliente;
    @EJB
    UsuarioFacade ejbCliente;

    //En el constructor no se puede usar el EJB porque no se ha ejecutado el inject, se debe hacer en el init
    public GestorUsuarioController() {
        System.out.println("Se ejecuta constructor en clase GestorClientesController");
        cliente = new Usuario();
    }

    @PostConstruct
    public void init() {
        System.out.println("Se ejecuta init() en clase GestorClientesController");
        listaClientes = ejbCliente.findAll();
    }

    public List<Usuario> getListaClientes() {
        return listaClientes;
    }

    public Usuario getListaClientes1() {

        String aux = "";
        Usuario Usr = null;
        for (int i = 0; i < listaClientes.size(); i++) {
            Usr = listaClientes.get(i);
            aux = String.valueOf(Usr.getCedula());
            if (aux.equals(cliente.getCedula())) {
                i = listaClientes.size();
            }
        }
        return Usr;
    }

    public void setListaClientes(List<Usuario> listaClientes) {
        this.listaClientes = listaClientes;
    }

    public Usuario getClienteSelected() {
        return clienteSelected;
    }

    /*
     * Para demostrar que es mejor tener un solo controller para acciones relacionadas
     * con una misma entidad, se requiere refrescar la lista en pantalla
     */
    public void testAction() {
        System.out.println("testAction ejecutado con exito");
    }

    public Usuario getCliente() {
        return cliente;
    }

    public void setCliente(Usuario cliente) {
        this.cliente = cliente;
    }

    public void crearCliente() {
        String msg = "Cliente creado con exito !!!";
        try {
            ejbCliente.crearCliente(cliente);
        } catch (BancoException be) {
            msg = be.getMessage();
        }
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(msg));
    }

    public void setClienteSelected(Usuario cte) {

        this.clienteSelected = cte;
        this.cliente = cte;
        System.out.println("Cliente seleccionado " + cliente.getCedula());
        System.out.println("Nombre cliente seleccionado: " + cliente.getNombre());
    }

    public SelectItem[] tipoRolValues() {
        SelectItem[] items = new SelectItem[TipoRol.values().length];
        int i = 0;
        for (TipoRol ti : TipoRol.values()) {
            items[i++] = new SelectItem(ti, ti.getLabel());
        }
        return items;
    }

    public SelectItem[] tipoEstadoValues() {
        SelectItem[] items = new SelectItem[TipoEstado.values().length];
        int i = 0;
        for (TipoEstado ti : TipoEstado.values()) {
            items[i++] = new SelectItem(ti, ti.getLabel());
        }
        return items;
    }

    public void modificarCliente() {
        System.out.println("Se invoca accion modificar cliente " + cliente.getCedula());
        String msg = "Cliente actualizado con exito !!!";
        try {
            System.out.println("Nombre a modificar: " + cliente.getCedula());
            ejbCliente.modificarCliente(cliente);
            System.out.println("Se actualizo cliente " + cliente.getCedula());
        } catch (Exception be) {
            msg = be.getMessage();
            System.out.println("Error:" + msg);
        }
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(msg));
    }

    public void eliminarCliente() {
        System.out.println("Se invoca accion elimar cliente " + clienteSelected.getCedula());
        String msg = "Cliente eliminado con exito !!!";
        try {
            ejbCliente.remove(clienteSelected);
            listaClientes.remove(clienteSelected);
        } catch (Exception be) {
            msg = be.getMessage();
        }
        FacesContext.getCurrentInstance().addMessage("mensajes", new FacesMessage(msg));
    }
}